package numb4;
import java.util.*;
import java.io.*;

public class Main {
    public static void main(String[] args) {
        HashTable HT=new HashTable();
        try {
            BufferedReader BR = new BufferedReader(new InputStreamReader(new FileInputStream("1.txt"),("Windows-1251")));
            String s;
            while((s = BR.readLine())!= null) {
                    for(int i = 0; i < s.length(); i++) {
                        char c=s.charAt(i); //обработчик знаков препинания
                        if(c=='.' || c==',' || c=='!' || c=='?' || c==')' || c=='(' || c==':' || c==';' || c=='!' || c=='"' || c=='\'' || c=='«' || c=='»' || c=='…')
                            s = s.substring(0, i) + s.substring(i+1);
                    }
                    Scanner Sc = new Scanner(s);
                    while(Sc.hasNext()) HT.set(Sc.next().toUpperCase());
            }
        }
        catch(Exception e) {};
         for (int i=0;i<HT.M.length;i++) {
                ListIterator<Pair> j=HT.M[i].listIterator();
                while (j.hasNext()) {
                    Pair t=j.next();
                    System.out.println(t.N+" | "+t.S); //выводим результат- число, слово
                }
            }
    }
}

class HashTable {
    public LinkedList<Pair>[] M;
    private int N;

    public HashTable() {
        M=new LinkedList[2];
        for (int i=0;i<2;i++)  M[i]=new LinkedList<Pair>();
        N=0;
    }

    public static int hash(String s, int m) { //хеш-функция
        return Math.abs(s.hashCode())%m;
    }

    public void set(String s) {
        {
            ListIterator<Pair> i=M[hash(s,M.length)].listIterator();
            while (i.hasNext()) {
                Pair t=i.next();
                if (t.S.equals(s)) {
                    t.N++; //если такое слово есть в списке, увеличиваем количество его вхождений на 1
                    return;
                }
            }
        }
        if (2*N==M.length) { //если количество пар равно половине длины массива
            LinkedList<Pair>[] T=new LinkedList[2*M.length]; //создаём массив списков длиннее прежнего 
            for (int i=0;i<2*M.length;i++) T[i]=new LinkedList<Pair>();
            for (int i=0;i<M.length;i++) {
                ListIterator<Pair> j=M[i].listIterator();
                while (j.hasNext()) {
                    Pair t=j.next();
                    T[hash(t.S,2*M.length)].add(t); //перераспределяем пары
                }
            }
            M=T;
        }
        M[hash(s,M.length)].add(new Pair(s,1)); //добавляем новое слово в массив списков
        N++;
    }

    public int get(String s) { //по заданному слову находим его в списке
        LinkedList L=M[hash(s,M.length)];
        ListIterator<Pair> i=L.listIterator();
        while (i.hasNext()) {
            Pair t=i.next();
            if (t.S.equals(s)) return t.N;
        }
        return 0;
    }
}

class Pair {// класс для создания объекта- слово, число вхождений этого слова в текст
    public String S;
    public int N;

    public Pair(String s, int n) {
        S=s;
        N=n;
    }
}